Fleet changelogs · dev.ecs0.net
rdmsm4x - feature - Concur export packs - codex - FEAT2026092619 - RDExpense - 202609271405

rdmsm4x - feature - Concur export packs - codex - FEAT2026092619 - RDExpense - 202609271405

2026-09-27 14:05:24 EDT; started 2026-09-27 13:51:30 EDT. Scope: rdmsm4x only.

Offline Concur export packs implemented, verified, merged and pushed.

RDExpense Concur export pack — FEAT-20260926-19

Status: done

Started: 2026-09-27 13:51:30 EDT. Completed: 2026-09-27 14:05:24 EDT. Host: rdmsm4x. Identity: codex/expenses-codex-0927. Delegated by expenses@rdmsm4x/expenses0926; parent EPIC-20260926-06.

Summary

Implemented DEC-20260926-11 Option B as rdexpense concur-pack. It reads local inventory.csv with a report-group and/or inclusive date-range selector, loads the RDExpenseProfile expense mapping, and emits CSV + XLSX, a matching source receipt for every row, merged receipt PDF and README with totals/category/policy summary. Only R001–R003 generated. Every per-expense file is below 5,000,000 bytes and its SHA-256 matches inventory. Claim amounts exactly match inventory and report_groups. Nothing submitted, emailed or uploaded to Concur. No credential, vault, xattr, rename/config-seam or app-shell work. No receipt bytes or live profile committed.

Commits

Files: ConcurPackGenerator.swift, ConcurPackGeneratorTests.swift, CLI main.swift, docs/CONCUR-EXPORT.md and SESSION-STATE.md. All staged by explicit paths. Existing Agent trailer hook remained enabled (it intentionally truncates session to 8 chars).

Tests

Evidence: build.log, targeted-tests.log, swift-test-final.log, discovered-tests.txt, pack-verification.json, pack-audit.log, pack-audit.stderr, pdf-reader-warnings.json, pdf-render-check/result.json in this handoff. The initial targeted test run had 8; the ninth was added before both full-suite runs.

Pack paths and totals

Each folder contains keying-sheet.csv, keying-sheet.xlsx, receipts/, receipts-merged.pdf and README.md.

Group Items Claim total USD Category breakdown USD
R001 6 $860.00 phone/internet: $860.00
R002 19 $2942.62 phone/internet: $1920.00; meals: $807.95; ground transport/parking/tolls: $214.67
R003 23 $2937.66 ground transport/parking/tolls: $786.85; phone/internet: $1187.22; meals: $941.81; other: $21.78

Combined: 48 expenses, USD 6,740.28, consisting of 42 PDF receipts and 6 JPEGs. Largest individual receipt: 908,921 bytes. No receipt conversion/compression needed. First generation preserved at /Users/richh/dev/finance/expenses/reports/archive/concur-initial-20260927-140029/ before regenerating sheets with column widths, filtering and frozen headers.

Notes

Export construction is complete; these files support owner review and manual keying, not automatic bulk import or a representation that every expense is eligible.

Reproduce / rollback

See canonical docs/CONCUR-EXPORT.md for CLI syntax. Re-run verify_packs.py with uv run --offline --with openpyxl --with pypdf python for read-only pack verification. To regenerate, archive the existing pack first or use a fresh output directory; the CLI intentionally refuses overwrites. To roll back code, revert the feature commit on a new branch and run the package suite. Keep receipt/source archives.